let Web3 = require('web3')
//1. 引入web3
//2. 创建web3实例
let web3 = new Web3()
//3. 指定服务商
web3.setProvider(new Web3.providers.HttpProvider('http://localhost:8545'))

let {interface, bytecode} = require('./compile')

//注，在创建web3时可以直接指定区块链网络
// let web3 = new Web3(new Web3.providers.HttpProvider('http://localhost:8545'));

console.log('version :', web3.version)
// console.log('provider :', web3.currentProvider)

//4. 部署合约
//a. 需要abi和bytecode

deploy = async () => {
    try {

        //await 方式
        let accounts = await web3.eth.getAccounts()

        // let accounts;
        //.then方式
        // web3.eth.getAccounts().then(as => {
        //     accounts = as
        // }).catch(e => {
        //     console.log(e)
        // })

        //回调函数方式
        // web3.eth.getAccounts((err, res) => {
        //     if (err) {
        //         throw err
        //     }
        //
        //     accounts = res
        // })

        console.log(accounts)
        let contract = await new web3.eth.Contract(JSON.parse(interface))
        //b. 创建后deploy, send
        let contractInstance = await contract.deploy({
            data: bytecode,
            arguments: ['HelloWorld'],
        }).send({
            from: accounts[0],
            gas: '1000000'
        })

        //获取合约的地址, 在options里面
        console.log('address :', contractInstance.options.address)


        //拿到了合约实例，接下来开始调用合约
        //1. 调用getMessage方法
        //读取区块链数据使用call就可以了，也可以使用send,不要这样做
        let msg = await contractInstance.methods.getMessage().call({
            from: accounts[0],
        })

        console.log('msg :', msg)

        //2. 调用setMessage方法

        let res = await contractInstance.methods.setMessage('Hello goland!').send({
            from: accounts[0],
        })

        console.log('res :', res)

        //3. 调用getMessage方法
        msg = await contractInstance.methods.getMessage().call({
            from: accounts[0],
        })

        console.log('msg :', msg)

    } catch (e) {
        console.log(e)
    }
}

deploy()

//注意事项：
//1. JSON.parse(interface)) 一定要解析为json字符串，否则会报错
//2. ['HelloWorld'], 构造函数传的是数组
//3.  部署合约的时候，一定要指定gas，一定要使用单引号包裹起来
//4. 记得要使用回调，async
//5. 调用
